<?php
/*
 * SoloPHP PHP框架
 * $Author: Yotianya <yotianya@gmail.com>
 * $Dtime:2011-10-24
 * $Copyright: CopyRight By SoloPHP Yotianya
 */


class Template{

        public $value=array();
        public $templates_dir = ''; 					//模板路径;
        public $templates_default = 'View'; 			//默认模板路径 'template';
	    public $templates_cache = 'cache/cache_tpl/';   //缓存模板路径 'data/cache/'(Sae环境下请使用saemc://cache/的格式);
        public $templates_charset = 'utf-8';
	    public $templates_postfix = '.html'; 			//模板后缀;
        public $templates_cachefix = '.php'; 			//缓存后缀;
        public $template_file ;							//模板存放方式(memcache/file)
        public $template_data ;							//模板数据获取方式(文件/数据库)
        public $templates_php = "<?php if(!defined('ROOT_PATH')) exit('Access Denied');?>"; //为每个缓存头部增加PHP码;
 		/**
 		 * 构造函数
		 */
        public function __construct(){

                header("content-Type: text/html; charset=utf-8 ");
		        if((int) phpversion() <5)self::error('PHP版本低于5.0');							// 确认php版本,低过设置的， 就提供一下debug出去。但不终止。
		        is_dir($this->templates_default) === false && self::error('默认目录不存在'); 		//禁止默认模板目录不存在
                if(is_dir($this->templates_cache) === false)mkdir($this->templates_cache,0700); //禁止默认模板目录不存在
                $this->templates_dir == NULL?$this->templates_dir =$this->templates_default:$this->templates_dir;//处理模板目录

        }
 		/**
 		 * 错误提示方法
 		 */
        public function error($msg){

            echo '<div style="border:dashed 1px #ccc;padding:10px;background-color:#F4F5F7;color:red;font-size:12px; line_height:25px;">!'.$msg.'</div>';
            exit();
        }


 		/**
 		 * 强制输入
 		 */
        public function assign() {

            $_key = @func_get_arg ( 0 );
            $_value = @func_get_arg ( 1 );
            if (is_array ( $_key )) {

                foreach ( $_key as $k => $v ) {
                    if(is_array($v)){
                        foreach ( $v as $kk => $vv ) {
                        $this->value [$kk] = $vv;
                        }
                    }
                    $this->value [$k] = $v;
                }
            } else {
                $this->value [$_key] = $_value;
            }
        }
 		/**
  		 * 取显示页面
  		 */
        public function show($file) {
            extract($this->value);
            $file === null ? $file = 'index' : $file;
            $cachefile = $this->template_getcache($file);
            include ($cachefile);



        }

 		/**
 		 * 编译模板（创建,更新用）
 		 * @param string $module
 		 * @param string $template
 		 * @return string 失败返回0 成功返回编译过后的地址
 		 */
        public function template_compile($file)
        {

                if($this->template_data='file'){
                    $path = $this->templates_dir.$file.$this->templates_postfix;
                    file_exists($path) === false?$this->error('模板文件不存在：'.$path): $content = file_get_contents($path);
                }else{
                    //数据库方式获取
                }
                $content = $this->template_parse($content);
                $compiledtplfile = $this->templates_cache.$file.$this->templates_cachefix;
                $strlen = file_put_contents($compiledtplfile,$this->templates_php.$content);
                @chmod($compiledtplfile, 0777);
                return $compiledtplfile;

        }
		/**
 		 * 获取Tpl编译过后的模板缓存文件
		 * @param string $module
 		 * @param string $template
 		 */
        public function template_getcache($file)
        {
            $templateFile = $this->templates_dir.$file.$this->templates_postfix;
            $compiledtplfile = $this->templates_cache.$file.$this->templates_cachefix;
            //如果tpl不存在 或者 模板文件的时间大于生成tpl文件的时间 就重新编译
            if(!file_exists($compiledtplfile) || filemtime($templateFile)>filemtime($compiledtplfile)){
                $this->template_compile($file);
            }
            return $compiledtplfile;
        }

		/**
 		 * 模板解析
		 */
        public function template($file) {
            $path = $this->templates_dir.'/'.$file.'.html';
            return $path;
        }
        public function template_parse($str)
        {
            $str = preg_replace("/([\n\r]+)\t+/s","\\1",$str);
            $str = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}",$str);
            $str = preg_replace("/\{template\s+(.+)\}/","\n<?php include self::template_compile(\\1); ?>\n",$str);
            $str = preg_replace("/\{include\s+(.+)\}/","\n<?php include \\1; ?>\n",$str);
            $str = preg_replace("/\{php\s+(.+)\}/","\n<?php \\1?>\n",$str);
            $str = preg_replace("/\{if\s+(.+?)\}/","<?php if(\\1) { ?>",$str);
            $str = preg_replace("/\{else\}/","<?php } else { ?>",$str);
            $str = preg_replace("/\{elseif\s+(.+?)\}/","<?php } elseif (\\1) { ?>",$str);
            $str = preg_replace("/\{\/if\}/","<?php } ?>",$str);
            $str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","<?php if(is_array(\\1)) foreach(\\1 AS \\2) { ?>",$str);
            $str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/","<?php if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>",$str);
            $str = preg_replace("/\{\/loop\}/","<?php } ?>\n",$str);
            $str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","<?php echo \\1;?>",$str);
			$str = preg_replace("/\{(\\\$[a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s", "<?php echo \\1;?>", $str);
            $str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>",$str);
            return $str;
        }
    }
    ?>